﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ComunesMGI.DataTypes;
using System.IO;
using ComunesMGI.Enum;
using System.Configuration;
using System.Xml;
using ComunesMGI.Excepciones;

namespace MGI.AccesoDatos.AccesoFS
{
    class FSIncidentes
    {
        /// <summary>
        /// Obtiene los nombres de los campos desde el archivo xml del cliente con nombre nomCliente
        /// y el sitema de nombre nomSistema
        /// </summary>
        /// <param name="nomCliente">Nombre del cliente</param>
        /// <param name="nomSistema">Nombre del sistema</param>
        /// <param name="tipoLista">Tipo de lista de la que se quiere obtener los campos</param>
        /// <returns>Lista de dataCampo conteniendo los nombres de los campos</returns>
        public List<DataCampo> GetCampos(string nomCliente, string nomSistema, Lista tipoLista)
        {
            //Se obtiene la path del directorio con los xml de los sitemas de los clientes
            string pathClientesInfo = ConfigurationManager.AppSettings.Get("pathInfoClientes");
            DirectoryInfo dirInfo = new DirectoryInfo(pathClientesInfo);

            string pathInfoSitema = pathClientesInfo + "\\" + nomCliente + "\\" + nomSistema + ".xml";

            //Lista con los nombre de los campos a retornar
            List<DataCampo> campos = new List<DataCampo>();

            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(pathInfoSitema);
            XmlNodeList listaNodoSistema = xDoc.GetElementsByTagName("sistema");
            if (listaNodoSistema.Count == 0)
            {
                throw new FormatoArchivoInvalido("El formato del archivo del sistema es inválido");

            }
            XmlNodeList listaNodoListas = ((XmlElement)listaNodoSistema[0]).GetElementsByTagName("listas");
            if (listaNodoListas.Count == 0)
            {
                throw new FormatoArchivoInvalido("El formato del archivo del sistema es inválido");
            }

            string lista = "";
            switch (tipoLista)
            {
                case Lista.Incidentes:
                    lista = "incidentes";
                    break;
                case Lista.Tareas:
                    lista = "tareas";
                    break;
                default:
                    break;
            }

            XmlNodeList listaNodoLista = ((XmlElement)listaNodoListas[0]).GetElementsByTagName(lista);
            if (listaNodoLista.Count == 0)
            {
                throw new FormatoArchivoInvalido("El formato del archivo del sistema es inválido");
            }


            XmlNodeList listaNodoCampos = ((XmlElement)listaNodoLista[0]).GetElementsByTagName("campos");

            if (listaNodoCampos.Count == 0)
            {
                throw new FormatoArchivoInvalido("El formato del archivo del sistema es inválido");
            }
            XmlNodeList listaNodoCampo = ((XmlElement)listaNodoCampos[0]).GetElementsByTagName("campo");
            foreach (XmlElement nodoCampo in listaNodoCampo)
            {
                XmlNodeList listaNombreCampo = nodoCampo.GetElementsByTagName("nombre");
                if (listaNombreCampo.Count == 0)
                {
                    throw new FormatoArchivoInvalido("El formato del archivo del sistema es inválido");
                }
                string nomCampo = ((XmlElement)listaNombreCampo[0]).InnerText;

                XmlNodeList listaParteMail = nodoCampo.GetElementsByTagName("parteMail");
                DataCampo dataCampo;
                ParteMail parteMail = ParteMail.NINGUNO;
                if (listaParteMail.Count != 0)
                {
                    string textoParteMail = ((XmlElement)listaParteMail[0]).InnerText;
                    

                    switch (textoParteMail)
                    {
                        case "BODY":
                            parteMail = ParteMail.BODY;
                            break;
                        case "DATE":
                            parteMail = ParteMail.DATE;
                            break;
                        case "FROM":
                            parteMail = ParteMail.FROM;
                            break;
                        case "SUBJECT":
                            parteMail = ParteMail.SUBJECT;
                            break;
                        case "NINGUNO":
                            parteMail = ParteMail.NINGUNO;
                            break;
                        default:
                            throw new FormatoArchivoInvalido("Parte mail invalido");
                          
                    }
                }

                dataCampo = new DataCampo(nomCampo, parteMail);
                campos.Add(dataCampo);
            }
            return campos;
        }
    }
}
